package manager.modulo.ordemservico.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.LinkedList;
import manager.auxiliares.MensagemExcessao;
import manager.interfaces.InterfaceDao;
import manager.modulo.ordemservico.enumerator.EnumSituacaoOrdemServico;
import manager.modulo.ordemservico.enumerator.EnumSituacaoOrdemServico.SituacaoOS;
import manager.principal.fonte.JanelaLogin;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class SituacaoOrdemServicoDao implements InterfaceDao {

    private int id;
    private SituacaoOS situacao;
    private Timestamp modificacao;
    private int idOrdemServico;
    private int idUsuario;
    private String observacao;
    private boolean ativo;

    /**
     * Inicializando as variáveis
     */
    public SituacaoOrdemServicoDao() {
        id = 0;
        situacao = SituacaoOS.NAOENCONTRADO;
        modificacao = new Timestamp(00 - 00 - 00);
        idOrdemServico = 0;
        idUsuario = 0;
        observacao = "";
        ativo = false;
    }

    /**
     * Buscar a ultima situação atualizada de uma ordem de serviço
     *
     * @param idOrdemServico
     * @return Retorno o id da situaação encontrado, caso contrário retorna 0
     * quando não o encontra
     */
    public static int buscarUltimaSituacao(int idOrdemServico) {
        try {

            String sql = "SELECT MAX(id) AS id FROM situacao_ord_serv WHERE id_ord_serv = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, idOrdemServico);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Situações de Ordem de Serviço");
            return 0;
        }
    }

    /**
     * Buscar a primeira situação atualizada de uma ordem de serviço
     *
     * @param idOrdemServico
     * @return Retorno o id da situacao encontrada, caso contrário retorna 0
     * quando não o encontra
     */
    public static int buscarPrimeiraSituacao(int idOrdemServico) {
        try {

            String sql = "SELECT MIN(id) AS id FROM situacao_ord_serv WHERE id_ord_serv = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, idOrdemServico);
            ResultSet resultSet = preparedStatement.executeQuery();
            int idBuscado = 0;
            if (resultSet.first()) {
                idBuscado = resultSet.getInt("id");
            }
            resultSet.close();
            preparedStatement.close();
            return idBuscado;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Situações de Ordem de Serviço");
            return 0;
        }
    }

    public static LinkedList<SituacaoOrdemServicoDao> buscaListaSituacao(int idOrdemServico) {
        LinkedList<SituacaoOrdemServicoDao> listaSituacao = new LinkedList<SituacaoOrdemServicoDao>();
        try {
            String sql = " SELECT * FROM situacao_ord_serv WHERE id_ord_serv = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, idOrdemServico);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                SituacaoOrdemServicoDao situacaoOrdemServicoDao = new SituacaoOrdemServicoDao();
                situacaoOrdemServicoDao.situacao = EnumSituacaoOrdemServico.ConverterNumeroEnum(resultSet.getInt("cd_situacao"));
                situacaoOrdemServicoDao.modificacao = resultSet.getTimestamp("dt_modificacao");
                situacaoOrdemServicoDao.idOrdemServico = resultSet.getInt("id_ord_serv");
                situacaoOrdemServicoDao.idUsuario = resultSet.getInt("id_usuario");
                situacaoOrdemServicoDao.ativo = resultSet.getBoolean("fl_ativo");
                situacaoOrdemServicoDao.observacao = resultSet.getString("tx_observacao");
                situacaoOrdemServicoDao.id = resultSet.getInt("id");
                listaSituacao.add(situacaoOrdemServicoDao);
            }
            resultSet.close();
            preparedStatement.close();
            return listaSituacao;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Situações de Ordem de Serviço");
            return listaSituacao;
        }
    }

    /**
     * Carregar as informações do objeto procedimento a partir de um id
     *
     * @param id Id do procedimento buscada
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM situacao_ord_serv WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                situacao = EnumSituacaoOrdemServico.ConverterNumeroEnum(resultSet.getInt("cd_situacao"));
                modificacao = resultSet.getTimestamp("dt_modificacao");
                idOrdemServico = resultSet.getInt("id_ord_serv");
                idUsuario = resultSet.getInt("id_usuario");
                observacao = resultSet.getString("tx_observacao");
                ativo = resultSet.getBoolean("fl_ativo");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Situações de Ordem de Serviço");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO situacao_ord_serv (cd_situacao,dt_modificacao,id_ord_serv,id_usuario,tx_observacao,fl_ativo) VALUES (?,?,?,?,?,?)";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setInt(1, EnumSituacaoOrdemServico.ConverterEnumNumero(situacao));
        preparedStatement.setTimestamp(2, modificacao);
        preparedStatement.setInt(3, idOrdemServico);
        preparedStatement.setInt(4, idUsuario);
        preparedStatement.setString(5, observacao);
        preparedStatement.setBoolean(6, ativo);
        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "UPDATE situacao_ord_serv SET  cd_situacao = ? , dt_modificacao = ? , id_ord_serv = ? , id_usuario = ? , tx_observacao = ? , fl_ativo = ? WHERE id = ?";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setInt(1, EnumSituacaoOrdemServico.ConverterEnumNumero(situacao));
        preparedStatement.setTimestamp(2, modificacao);
        preparedStatement.setInt(3, idOrdemServico);
        preparedStatement.setInt(4, idUsuario);
        preparedStatement.setString(5, observacao);
        preparedStatement.setBoolean(6, ativo);
        preparedStatement.setInt(7, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        String sql = "DELETE FROM situacao_ord_serv WHERE id = ? ";
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setInt(1, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getIdOrdemServico() {
        return idOrdemServico;
    }

    public void setIdOrdemServico(int idOrdemServico) {
        this.idOrdemServico = idOrdemServico;
    }

    public int getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Timestamp getModificacao() {
        return modificacao;
    }

    public void setModificacao(Timestamp modificacao) {
        this.modificacao = modificacao;
    }

    public SituacaoOS getSituacao() {
        return situacao;
    }

    public void setSituacao(SituacaoOS situacao) {
        this.situacao = situacao;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public LinkedList<String> buscar(String opcao, String buscado, boolean limite) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
